package com.example.springcloud.controller;

import com.example.springcloud.pojo.Dept;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

/**
 * @author :lihao
 * @date :2020/11/27
 * @description : 请求接口
 */
@RestController
public class DeptConsumerController {

    /**
     * 理解：消费者不应该有service层
     * RestTemplate 供我们直接调用就可以了！注册到Spring中
     * (url, 实体:Map, Class<T> responseType)
     * 什么方式拿，去哪拿，拿什么类型东西
     * 提供多种便捷访问远程http服务的方法
     * 简单的restful服务模板
     */
    @Autowired
    private RestTemplate restTemplate;

    // 通过Ribbon实现负载均衡时，链接地址应该是变量，通过服务名访问
    //private static final String REST_URL_PREFIX = "http://localhost:8001";
    private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-PROVIDER-DEPT";

    /**
     * 客户端添加一个部门
     * @param dept 部门对象
     * @return 添加结果
     */
    @RequestMapping("/consumer/dept/add")
    public boolean add(Dept dept) {
        return restTemplate.postForObject(REST_URL_PREFIX + "/dept/add", dept, Boolean.class);
    }

    /**
     * 通过部门id获取部门信息
     * @param id 部门id
     * @return 部门信息
     */
    @RequestMapping("/consumer/dept/get/{id}")
    @HystrixCommand(fallbackMethod = "hystrixGetDept")
    public Dept get(@PathVariable("id") Long id) {
        Dept dept = restTemplate.getForObject(REST_URL_PREFIX + "/dept/get/" + id, Dept.class);
        if (dept == null) {
            throw new RuntimeException("查询不到");
        }
        return dept;
    }

    /**
     * 备选方法
     * 当服务发生熔断时调用该方法
     */
    public Dept hystrixGetDept(@PathVariable("id") Long id) {
        return new Dept()
                .setDeptNo(id)
                .setDeptName("not have DeptName,this is @Hystrix")
                .setDbSource("no this database in MySql");
    }

    /**
     * 查询所有部门
     * @return 部门列表
     */
    @RequestMapping("/consumer/dept/list")
    public List<Dept> list() {
        return restTemplate.getForObject(REST_URL_PREFIX + "/dept/list", List.class);
    }
}
